package eva.savant.business.contabilidad.view

import eva.savant.businessobject.cg.Cuenta
import eva.savant.businessobject.cg.Partida
import eva.savant.core.view.Bean

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct

@SessionScoped
@ManagedBean(name = 'IIEstadoResultados')
public class IIEstadoResultados extends Bean{

  Date dateIni, dateEnd

  def utilidad, nivel, lsNivel

  HashMap<String,Cuenta> lsFila

  List<Cuenta> lsIngreso, lsCosto, lsGasto

  @PostConstruct
  public void cleanEntity() {

    dateIni= dateEnd= new Date()

    lsNivel= find(Cuenta.class,'nivel: tipo = 0 group by nivel order by nivel desc')
  }

  public List findLsEntity() {

    if(dateIni == null || dateEnd == null) return null

    def lsCuenta= find(Cuenta.class,'order by id')

    buildDetalle(lsCuenta)

    buildGrupo(lsFila['4'])

    buildGrupo(lsFila['5'])

    buildGrupo(lsFila['6'])

    buildUI(lsCuenta)

    return null
  }

  public void buildDetalle(List<Cuenta> lsCuenta) {

    lsFila= new HashMap<String,Cuenta>()

    for(x in lsCuenta) lsFila.put(x.codigo,x)


    def lsPartida= find(Partida.class,'cuenta.codigo, sum(debe), sum(haber), cuenta.signo: asiento.fecha between ? and ? group by cuenta.id order by asiento.id', dateIni, toMidnight(dateEnd))

    for(x in lsPartida) {

    String     code  = x[0]

    BigDecimal debe  = x[1]

    BigDecimal haber = x[2]

    BigDecimal signo = x[3]

    BigDecimal saldo = 0


    if(code.startsWith('4')) saldo= haber - debe

    if(code.startsWith('5')) saldo= debe - haber

    if(code.startsWith('6')) saldo= debe - haber


    lsFila[code].saldo= saldo * signo }
  }

  public BigDecimal buildGrupo(Cuenta cuenta) {

    if(cuenta.lsCuenta.size() < 1) return cuenta.saldo

    BigDecimal suma= 0

    for(x in cuenta.lsCuenta) suma= suma + buildGrupo(x)

    cuenta.saldo= suma
  }

  public void buildUI(List<Cuenta> lsCuenta) {

    lsIngreso= new ArrayList<Cuenta>()

    lsCosto= new ArrayList<Cuenta>()

    lsGasto= new ArrayList<Cuenta>()


    for(x in lsCuenta) { if(x.saldo != 0)

         if(x.codigo.startsWith('4')) lsIngreso.add x

    else if(x.codigo.startsWith('5')) lsCosto.add x

    else if(x.codigo.startsWith('6')) lsGasto.add x  }


    def ingreso= lsIngreso.size() > 0? lsIngreso[0].saldo : 0

    def costo= lsCosto.size() > 0? lsCosto[0].saldo : 0

    def gasto= lsGasto.size() > 0? lsGasto[0].saldo : 0

    utilidad=  ingreso - ( costo + gasto)
  }

}
